package org.apache.rocketmq.proxy.remoting.activity;

import io.netty.channel.ChannelHandlerContext;
import org.apache.rocketmq.proxy.common.ProxyContext;
import org.apache.rocketmq.proxy.processor.MessagingProcessor;
import org.apache.rocketmq.proxy.service.route.ProxyTopicRouteData;
import org.apache.rocketmq.remoting.protocol.RemotingCommand;
import org.apache.rocketmq.remoting.protocol.ResponseCode;
import org.apache.rocketmq.remoting.protocol.header.namesrv.GetRouteInfoRequestHeader;

/**
 * @方法描述：根据主题获取路由信息的对象
 */
public class GetTopicRouteActivity extends AbstractRemotingActivity{
    public GetTopicRouteActivity(MessagingProcessor messagingProcessor) {
        super( messagingProcessor);
    }


    /**
     * @课程描述:从零带你写框架系列中的课程，整个系列包含netty，xxl-job，rocketmq，nacos，sofajraft，spring，springboot，disruptor，编译器，虚拟机等等。
     * @author：陈清风扬，个人微信号：chenqingfengyangjj。
     * @date:2024/12/30
     * @方法描述：该方法和源码并不一致，我做了简化，是一个伪代码，真正的根据主题获取路由信息功能，等后面版本代码再为大家重构完整
     */
    @Override
    protected RemotingCommand processRequest0(ChannelHandlerContext ctx, RemotingCommand request,
                                              ProxyContext context) throws Exception {
        //创建响应对象
        final RemotingCommand response = RemotingCommand.createResponseCommand(null);
        //解析请求头，从请求头中获取主题信息，但在第三版本代码中，这里获得请求头没什么意思，因为当前方法目前还是伪方法
        //我们根本就没有引入路由功能，所以这里就算获得了请求头，也没有什么用
        final GetRouteInfoRequestHeader requestHeader = (GetRouteInfoRequestHeader) request.decodeCommandCustomHeader(GetRouteInfoRequestHeader.class);
        //使用消息处理器，调用消息处理器的方法获得路由信息，从这里也能看出来，真正提供功能的还是消息处理器
        ProxyTopicRouteData proxyTopicRouteData = messagingProcessor.getTopicRouteDataForProxy(context, null, requestHeader.getTopic());
        //得到有效响应体
        byte[] content = proxyTopicRouteData.buildTopicRouteData().encode();
        //把响应体设置到响应对象中
        response.setBody(content);
        //设置成功响应状态码
        response.setCode(ResponseCode.SUCCESS);
        //设置备注信息为空
        response.setRemark(null);
        return response;
    }

    @Override
    public boolean rejectRequest() {
        return false;
    }
}
